home *** CD-ROM | disk | FTP | other *** search
File List | 1989-12-13 | 5.5 KB | 247 lines |
- _C CUSTOMIZED MEMORY ALLOCATORS_
- by Paul Anderson
-
- [LISTING ONE]
-
-
- /* sym1.c - symbol table data types */
-
- #include <stdio.h>
- #include "xalloc.h"
- #include "defs.h"
-
- main()
- {
- Symbol *p1, *p2;
- char *ps = "test string";
- int *p5;
-
- p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
- p1->dtype = STRING;
- p1->val.pstring = xmalloc(strlen(ps) + 1);
- strcpy(p1->val.pstring, ps);
-
- p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
- p2->dtype = DOUBLE;
- p2->val.pdouble = (double *) xmalloc(sizeof(double));
- *p2->val.pdouble = 6.7e-13;
-
- printf("%s\n", p1->val.pstring);
- printf("%g\n", *p2->val.pdouble);
-
- p5 = (int *) xmalloc(30000 * sizeof(int));
- }
-
- $ sym1
- test string
- 6.7e-13
- file sym1.c - line 26: malloc error for 60000 bytes
-
-
- [LISTING TWO]
-
- #include <stdio.h>
- #include <malloc.h>
-
- #define MAXBUF 256 /* size of debug buffer */
- static char *dbuf[MAXBUF]; /* debug buffer */
-
- /* ymalloc2.c - front end for malloc()
- Version 2
- */
-
- char *ymalloc(file, lineno, nbytes)
- char *file;
- int lineno;
- unsigned int nbytes;
- {
- char *pheap;
- void install();
-
- pheap = malloc(nbytes);
- if (pheap == (char *) NULL) {
- fprintf(stderr,"file %s - line %d: malloc error for %u bytes\n",
- file, lineno, nbytes);
- exit(1);
- }
- install(pheap); /* place in debug buffer */
- return pheap;
- }
-
- void install(pheap) /* store heap pointer in debug buffer */
- char *pheap;
- {
- register char **pbuf;
-
- for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
- if (*pbuf == (char *) NULL) {
- *pbuf = pheap;
- return;
- }
- fprintf(stderr, "No room left in debug buffer\n");
- exit(1);
- }
-
- char *yrealloc(file, lineno, oldp, nbytes)
- char *file, *oldp;
- int lineno;
- unsigned int nbytes;
- {
- char *newp;
- register char **pbuf;
- short found = 0;
-
- if (oldp != (char *) NULL)
- for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
- if (*pbuf == oldp) { /* find oldp's slot */
- found = 1;
- break;
- }
- if (!found) {
- fprintf(stderr,"file %s - line %d: realloc error for address %x\n",
- file, lineno, oldp);
- exit(1);
- }
- newp = realloc(oldp, nbytes);
- if (newp == (char *) NULL) {
- fprintf(stderr,"file %s - line %d: realloc error for %u bytes\n",
- file, lineno, nbytes);
- exit(1);
- }
- *pbuf = newp; /* replace in debug buffer's old slot */
- return newp;
- }
-
- void yfree(file, lineno, pheap)
- char *file, *pheap;
- int lineno;
- {
- register char **pbuf;
-
- if (pheap != (char *) NULL)
- for (pbuf = dbuf; pbuf < dbuf + MAXBUF; pbuf++)
- if (*pbuf == pheap) {
- *pbuf = NULL;
- free(pheap);
- return;
- }
- fprintf(stderr,"file %s - line %d: free error for address %x\n",
- file, lineno, pheap);
- exit(1);
- }
-
-
- [LISTING THREE]
-
-
- /* sym2.c - more symbol table data types */
-
- #include <stdio.h>
- #include "xalloc.h"
- #include "defs.h"
-
- main()
- {
- Symbol *p1, *p2;
- char *ps = "test string";
- char *ps2 = "much longer test string";
-
- p1 = (Symbol *) xmalloc(sizeof(struct Symbol));
- p1->dtype = STRING;
- p1->val.pstring = xmalloc(strlen(ps) + 1);
- strcpy(p1->val.pstring, ps);
-
- p2 = (Symbol *) xmalloc(sizeof(struct Symbol));
- p2->dtype = DOUBLE;
- p2->val.pdouble = (double *) xmalloc(sizeof(double));
- *p2->val.pdouble = 6.7e-13;
-
- printf("%s\n", p1->val.pstring);
- printf("%g\n", *p2->val.pdouble);
-
- p1->val.pstring = xrealloc(p1->val.pstring, strlen(ps2) + 1);
- strcpy(p1->val.pstring, ps2);
- printf("%s\n", p1->val.pstring);
-
- xfree((char *) p2->val.pdouble);
- xfree(ps2); /* free a bad pointer */
- }
-
- $ sym2
- test string
- 6.7e-13
- much longer test string
- file sym2.c - line 31: free error for address 2634
-
-
-
- Example 1: Out of bounds references
-
- /* twzone.c - array out of bounds */
-
- main()
- {
- int buf[10];
-
- buf[-4] = 1; /* negative subscript */
- buf[10] = 2; /* one step beyond */
-
- printf("%d %d\n", *(buf - 4), *(buf + 10));
- }
-
-
- Example 2: Program that demonstartes xcalloc()
-
-
- /* neg.c - negative subscripts with xcalloc */
-
- #include <stdio.h>
-
- main()
- {
- char *xcalloc();
- int *p, *q;
-
- p = (int *) xcalloc(10, sizeof(int));
- q = (int *) xcalloc(15, sizeof(int));
-
- fill(p); /* fill with 10 numbers */
- display(p); /* print 10 numbers */
-
- fill(q); /* fill with 15 numbers */
- display(q); /* print 15 numbers */
- }
-
- $ neg
- 1 2 3 4 5 6 7 8 9 10
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-
-
- Example 3: xcalloc() routine
-
-
-
- #include <stdio.h>
- #include <malloc.h>
- #include <memory.h>
-
- char *xcalloc(nitems, size) /* custom calloc() */
- unsigned nitems, size;
- {
- char *pheap;
- unsigned blksize;
-
- blksize = nitems * size; /* size of chunk */
-
- if ((pheap = malloc(blksize + sizeof(int))) == NULL) {
- fprintf(stderr, "Can't malloc on heap\n");
- exit(1);
- }
- *(int *)pheap = nitems; /* store no. of items in heap */
-
- memset(pheap + sizeof(int), 0, blksize); /* zero the area */
-
- return pheap + sizeof(int); /* pointer to data */
- }
-